package org.shj.pattern.flyweight;

/**
 * 享元模式： 运用共享技术有效地支持大量细粒度的对象。
 * 享元模式可以避免大量非常相似类的开销。在程序设计中， 有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数基本上都是相同的，有时就能够
 * 大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面，在方法调用时候将它们传递进来，就可以通过共享大幅度地减少单个实例的数目。
 * 例子： 字符串； 棋类游戏中棋子
 * 
 * 优点： 大大减少对象的创建，降低系统的内存，使效率提高 
 * 缺点： 需要分离出外部状态和内部状态， 提高了系统的复杂度，而且外部状态不应该随着内部状态的变化而变化
 * @author huangjian
 *
 */
public class Main {

	public static void main(String[] args){
		int extrinsicState = 22;
		
		FlyweightFactory f = new FlyweightFactory();
		
		Flyweight fx = f.getFlyweight("X");
		fx.operation(--extrinsicState);
		
		Flyweight fy = f.getFlyweight("Y");
		fy.operation(--extrinsicState);
		
		Flyweight fz = f.getFlyweight("Z");
		fz.operation(--extrinsicState);
		
		UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
		uf.operation(--extrinsicState);
	}
}
